import CryptorES from "crypto-es";

/**
 * 加密器
 */
export default class Cryptor {
    // aes的默认密钥
    private static _key: string = null;
    // aes的默认初始化向量
    private static _iv: CryptorES.lib.WordArray = null;

    /**
     * md5加密
     * @param data 需要加密的字符串
     * @returns 加密后的字符串
     */
    public static MD5(data: string): string {
        return CryptorES.MD5(data).toString();
    }

    public static SHA256(data: string): string {
        return CryptorES.SHA256(data).toString();
    }

    /**
     * 初始化加密器
     * @param key 加密时使用的默认key
     * @param iv 加密时使用的默认iv
     */
    public static Init(key: string, iv: string) {
        this._key = key;
        this._iv = CryptorES.enc.Hex.parse(iv);
    }

    /**
     * aes加密
     * @param data 需要加密的数据
     * @param key 加密使用的key，不传则使用初始化时的key
     * @param iv 加密使用的iv，不传则使用初始化时的iv
     * @returns 加密后的结果串
     */
    public static AESEncrypt(data: string, key: string = null, iv: string = null): string {
        return CryptorES.AES.encrypt(data,
            key ?? this._key, {
            iv: iv ? CryptorES.enc.Hex.parse(iv) : this._iv
        }).toString();
    }

    // aes解密
    public static AESDecrypt(data: string, key: string = null, iv: string = null): string {
        return CryptorES.AES.decrypt(data,
            key ?? this._key, {
            iv: iv ? CryptorES.enc.Hex.parse(iv) : this._iv
        }).toString(CryptorES.enc.Utf8);
    }

    public static Base64Encode(data: string): string {
        return CryptorES.enc.Base64.stringify(CryptorES.enc.Utf8.parse(data))
    }

    public static Base64Decode(data: string): string {
        return CryptorES.enc.Utf8.stringify(CryptorES.enc.Base64.parse(data));
    }
}

export function md5(data: string): string {
    return Cryptor.MD5(data);
}

export function sha256(data: string): string {
    return Cryptor.SHA256(data);
}

export function aes_encrypt(data: string, key: string = null, iv: string = null): string {
    return Cryptor.AESEncrypt(data, key, iv);
}

export function aes_decrypt(data: string, key: string = null, iv: string = null): string {
    return Cryptor.AESDecrypt(data, key, iv);
}

export function base64_encode(data: string): string {
    return Cryptor.Base64Encode(data);
}

export function base64_decode(data: string): string {
    return Cryptor.Base64Decode(data);
}